home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1419 / 1419.xpi / chrome / content / ietabOverlay.js < prev    next >
Text File  |  2009-02-07  |  30KB  |  768 lines

  1. /*
  2.  * Copyright (c) 2005 yuoo2k <yuoo2k@gmail.com>
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Lesser General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2.1 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12.  * Lesser General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  17.  *
  18.  */
  19. const gIeTabChromeStr = "chrome://ietab/content/reloaded.html?url=";
  20.  
  21. IeTab.prototype.QueryInterface = function(aIID) {
  22.    if (aIID.equals(Components.interfaces.nsIIeTab) || aIID.equals(Components.interfaces.nsISupports))
  23.       return gIeTab;
  24.    throw Components.results.NS_NOINTERFACE;
  25. }
  26.  
  27. IeTab.prototype.getIeTabURL = function(url) {
  28.    if (gIeTab.startsWith(url, gIeTabChromeStr)) return url;
  29.    if (/^file:\/\/.*/.test(url)) try { url = decodeURI(url).substring(8).replace(/\|/g,":").replace(/\//g,"\\"); }catch(e){}
  30.    return gIeTabChromeStr + encodeURI(url);
  31. }
  32.  
  33. IeTab.prototype.getIeTabTrimURL = function(url) {
  34.    if (url && url.length>0) {
  35.       url = url.replace(/^\s+/g,"").replace(/\s+$/g,"");
  36.       if (/^file:\/\/.*/.test(url)) url = url.replace(/\|/g,":");
  37.       if (url.indexOf(gIeTabChromeStr) == 0) {
  38.          url = decodeURI(url.substring(gIeTabChromeStr.length));
  39.       }
  40.    }
  41.    return url;
  42. }
  43.  
  44. IeTab.prototype.getIeTabElmt = function(aTab) {
  45.    var aBrowser = (aTab ? aTab.linkedBrowser : gBrowser);
  46.    if (aBrowser && aBrowser.currentURI && gIeTab.startsWith(aBrowser.currentURI.spec, gIeTabChromeStr)) {
  47.       if (aBrowser.contentDocument && aBrowser.contentDocument.getElementById('IETab')){
  48.          var obj = aBrowser.contentDocument.getElementById('IETab');
  49.          return (obj.wrappedJSObject ? obj.wrappedJSObject : obj);
  50.       }
  51.    }
  52.    return null;
  53. }
  54.  
  55. IeTab.prototype.getIeTabElmtURL = function(aTab) {
  56.    var aBrowser = (aTab ? aTab.linkedBrowser : gBrowser);
  57.    var url = gIeTab.getIeTabTrimURL(aBrowser.currentURI.spec);
  58.    var ietab = gIeTab.getIeTabElmt(aTab);
  59.    if (ietab && ietab.url && ietab.url != "") {
  60.       url = (/^file:\/\/.*/.test(url) ? encodeURI(gIeTab.convertToUTF8(ietab.url)) : ietab.url);
  61.    }
  62.    return url;
  63. }
  64.  
  65. IeTab.prototype.isIeForceable = function(url) {
  66.    return(url && (url.length>0) &&
  67.              ((url=="about:blank") ||
  68.               gIeTab.startsWith(url, 'http://') ||
  69.               gIeTab.startsWith(url, 'https://') ||
  70.               gIeTab.startsWith(url, 'file://') ||
  71.               gIeTab.startsWith(url, 'ftp://')
  72.              )
  73.          );
  74. }
  75.  
  76. IeTab.prototype.isIeEngine = function() {
  77.    return gIeTab.getIeTabElmt();
  78. }
  79.  
  80. IeTab.prototype.switchTabEngine = function(aTab, isOpenNewTab) {
  81.    if (aTab && aTab.localName == "tab") {
  82.       var url = gIeTab.getIeTabElmtURL(aTab);
  83.       var ietab = gIeTab.getIeTabElmt(aTab);
  84.       if (!ietab) url = gIeTab.getIeTabURL(url);
  85.       gBrowser.mIeTabSwitchURL = url;
  86.       if (isOpenNewTab) {
  87.          var newTab = gBrowser.addTab(url);
  88.          var focustab = gIeTab.getBoolPref("ietab.focustab", true);
  89.          if (focustab) gBrowser.selectedTab = newTab;
  90.       } else {
  91.          if (aTab.linkedBrowser) aTab.linkedBrowser.loadURI(url);
  92.       }
  93.       gBrowser.mIeTabSwitchURL = null;
  94.    }
  95. }
  96.  
  97. IeTab.prototype.switchEngine = function(isOpenNewTab) {
  98.    gIeTab.switchTabEngine(gBrowser.mCurrentTab, isOpenNewTab);
  99. }
  100.  
  101. IeTab.prototype.openPrefDialog = function(url) {
  102.    if (!url) url = gIeTab.getIeTabElmtURL();
  103.    var icon = document.getElementById('ietab-status');
  104.    window.openDialog('chrome://ietab/content/ietabSetting.xul', null,
  105.       'chrome,centerscreen,dependent', gIeTab.getUrlDomain(url), icon);
  106. }
  107.  
  108. IeTab.prototype.loadInExtApp = function(url) {
  109.    if (/^file:\/\/.*/.test(url)) try { url = decodeURI(url).substring(8).replace(/\//g, "\\"); }catch(e){}
  110.    url = gIeTab.convertToASCII(url);
  111.    var param = gIeTab.getStrPref("ietab.extAppParam", "%1").replace(/%1/g, url);
  112.    var path = gIeTab.getStrPref("ietab.extAppPath", "");
  113.    return IeTabExtApp.runApp(path, param);
  114. }
  115.  
  116. IeTab.prototype.viewPageInExtApp = function(aTab) {
  117.    return gIeTab.loadInExtApp(gIeTab.getIeTabElmtURL(aTab));
  118. }
  119.  
  120. IeTab.prototype.viewLinkInExtApp = function() {
  121.    return gIeTab.loadInExtApp(gIeTab.getContextLinkURL());
  122. }
  123.  
  124. IeTab.prototype.clickButton = function(e) {
  125.    if (e.button == 0) {
  126.       if (e.ctrlKey) {
  127.          var ctrlExtApp = gIeTab.getBoolPref("ietab.ctrlclick", true);
  128.          if (ctrlExtApp ? gIeTab.viewPageInExtApp() : false) return;
  129.       }
  130.       gIeTab.switchEngine(e.ctrlKey || gIeTab.getBoolPref("ietab.alwaysNewTab", false));
  131.    }
  132.    if (e.button == 1) gIeTab.switchEngine(true);
  133.    if (e.button == 2) gIeTab.openPrefDialog();
  134.    e.preventDefault();
  135. }
  136.  
  137. IeTab.prototype.getContextLinkURL = function() {
  138.    return (gContextMenu ? gContextMenu.link.toString() : null);
  139. }
  140.  
  141. IeTab.prototype.loadIeTab = function(url) {
  142.    url = gIeTab.getIeTabTrimURL(url);
  143.    gBrowser.loadURI(gIeTab.getIeTabURL(url));
  144. }
  145.  
  146. IeTab.prototype.addIeTab = function(url) {
  147.    url = gIeTab.getIeTabTrimURL(url);
  148.    var newTab = gBrowser.addTab(gIeTab.getIeTabURL(url));
  149.    var focustab = gIeTab.getBoolPref("ietab.focustab", true);
  150.    if (focustab) {
  151.       gBrowser.selectedTab = newTab;
  152.       if (gURLBar && (url == 'about:blank'))
  153.          window.setTimeout(function(){ gURLBar.focus(); }, 0);
  154.    }
  155. }
  156.  
  157. IeTab.prototype.ietabContextMenuPopup = function(e) {
  158.    if (e.originalTarget != document.getElementById("contentAreaContextMenu")) return;
  159.    if (!gContextMenu) return;
  160.  
  161.    var hide4Page = gContextMenu.isTextSelected || gContextMenu.onLink || gContextMenu.onImage || gContextMenu.onTextInput;
  162.    var hide4Link = (!gContextMenu.onLink) || (!gIeTab.isIeForceable(gIeTab.getContextLinkURL())); //if link is javascript
  163.  
  164.    var internal = gIeTab.getBoolPref("ietab.pagelink", true);
  165.    var external = gIeTab.getBoolPref("ietab.pagelink.extapp", true);
  166.    var showicon = gIeTab.getBoolPref("ietab.icon.pagelink", false);
  167.  
  168.    var menuitem = null;
  169.  
  170.    //click on page
  171.    menuitem = document.getElementById("ietab-viewpage");
  172.    menuitem.hidden = hide4Page || !internal;
  173.    menuitem.setAttribute("class", (showicon?menuitem.getAttribute("iconic"):""));
  174.  
  175.    menuitem = document.getElementById("ietab-viewpage-extapp");
  176.    menuitem.hidden = hide4Page || !external;
  177.    menuitem.setAttribute("class", (showicon?menuitem.getAttribute("iconic"):""));
  178.  
  179.    menuitem = document.getElementById("ietab-viewpage-sep");
  180.    menuitem.hidden = hide4Page || (!internal && !external);
  181.  
  182.    //click on link
  183.    menuitem = document.getElementById("ietab-viewlink");
  184.    menuitem.hidden = hide4Link || !internal;
  185.    menuitem.setAttribute("class", (showicon?menuitem.getAttribute("iconic"):""));
  186.  
  187.    menuitem = document.getElementById("ietab-viewlink-extapp");
  188.    menuitem.hidden = hide4Link || !external;
  189.    menuitem.setAttribute("class", (showicon?menuitem.getAttribute("iconic"):""));
  190. }
  191.  
  192. IeTab.prototype.getHandledURL = function(url, isModeIE) {
  193.    url = gIeTab.trim(url);
  194.    if (isModeIE) return gIeTab.getIeTabURL(url);
  195.    if ( gIeTab.isIeEngine()
  196.       && (!gIeTab.startsWith(url, "about:"))
  197.       && (!gIeTab.startsWith(url, "view-source:"))
  198.       ) {
  199.       var isBlank = (gIeTab.getIeTabTrimURL(gBrowser.currentURI.spec)=="about:blank");
  200.       var handleUrlBar = gIeTab.getBoolPref("ietab.handleUrlBar", false);
  201.       var isSimilar = (gIeTab.getUrlDomain(gIeTab.getIeTabElmtURL()) == gIeTab.getUrlDomain(url));
  202.       if (isBlank || handleUrlBar || isSimilar) return gIeTab.getIeTabURL(url);
  203.    }
  204.    return url;
  205. }
  206.  
  207. IeTab.prototype.updateUrlBar = function() {
  208.    if (!gURLBar || !gIeTab.isIeEngine()) return;
  209.    if (gBrowser.userTypedValue) {
  210.       if (gURLBar.selectionEnd != gURLBar.selectionStart)
  211.          window.setTimeout(function(){ gURLBar.focus(); }, 0);
  212.    } else {
  213.       var url = gIeTab.getIeTabElmtURL();
  214.       if (url == "about:blank") url = "";
  215.       if (gURLBar.value != url) gURLBar.value = url;
  216.    }
  217. }
  218.  
  219. IeTab.prototype.updateToolButton = function() {
  220.    var btn = document.getElementById("ietab-button");
  221.    if (btn) {
  222.       btn.setAttribute("engine", (gIeTab.isIeEngine()?"ie":"fx"));
  223.    }
  224. }
  225.  
  226. IeTab.prototype.updateStatusIcon = function() {
  227.    var img = document.getElementById("ietab-status-image");
  228.    if (img) {
  229.       img.setAttribute("engine", (gIeTab.isIeEngine()?"ie":"fx"));
  230.  
  231.       var show = gIeTab.getBoolPref("ietab.statusbar", true);
  232.       var icon = document.getElementById('ietab-status');
  233.       if (icon && show) {
  234.          icon.removeAttribute("hidden");
  235.       }else{
  236.          icon.setAttribute("hidden", true);
  237.       }
  238.    }
  239. }
  240.  
  241. IeTab.prototype.updateObjectDisabledStatus = function(objId, isEnabled) {
  242.    var obj = ( typeof(objId)=="object" ? objId : document.getElementById(objId) );
  243.    if (obj) {
  244.       var d = obj.hasAttribute("disabled");
  245.       if (d == isEnabled) {
  246.          if (d) obj.removeAttribute("disabled");
  247.          else obj.setAttribute("disabled", true);
  248.       }
  249.    }
  250. }
  251.  
  252. IeTab.prototype.updateBackForwardButtons = function() {
  253.    try {
  254.       var ietab = gIeTab.getIeTabElmt();
  255.       var canBack = (ietab ? ietab.canBack : false) || gBrowser.webNavigation.canGoBack;
  256.       var canForward = (ietab ? ietab.canForward : false) || gBrowser.webNavigation.canGoForward;
  257.       gIeTab.updateObjectDisabledStatus("Browser:Back", canBack);
  258.       gIeTab.updateObjectDisabledStatus("Browser:Forward", canForward);
  259.    }catch(e){}
  260. }
  261.  
  262. IeTab.prototype.updateStopReloadButtons = function() {
  263.    try {
  264.       var ietab = gIeTab.getIeTabElmt();
  265.       var isBlank = (gBrowser.currentURI.spec == "about:blank");
  266.       var isLoading = gBrowser.mIsBusy;
  267.       gIeTab.updateObjectDisabledStatus("Browser:Reload", ietab ? ietab.canRefresh : !isBlank);
  268.       gIeTab.updateObjectDisabledStatus("Browser:Stop", ietab ? ietab.canStop : isLoading);
  269.    }catch(e){}
  270. }
  271.  
  272. IeTab.prototype.updateGoMenuItems = function(e) {
  273.    var goPopup = document.getElementById("goPopup");
  274.    if (!goPopup || (e.originalTarget != goPopup)) return;
  275.    try {
  276.       var ietab = gIeTab.getIeTabElmt();
  277.       var canBack = (ietab ? ietab.canBack : false) || gBrowser.webNavigation.canGoBack;
  278.       var canForward = (ietab ? ietab.canForward : false) || gBrowser.webNavigation.canGoForward;
  279.       var goBack = goPopup.getElementsByAttribute("key","goBackKb");
  280.       if (goBack) gIeTab.updateObjectDisabledStatus(goBack[0], canBack);
  281.       var goForward = goPopup.getElementsByAttribute("key","goForwardKb");
  282.       if (goForward) gIeTab.updateObjectDisabledStatus(goForward[0], canForward);
  283.    }catch(e){}
  284. }
  285.  
  286. IeTab.prototype.updateEditMenuItems = function(e) {
  287.    if (e.originalTarget != document.getElementById("menu_EditPopup")) return;
  288.    var ietab = gIeTab.getIeTabElmt();
  289.    if (ietab) {
  290.       gIeTab.updateObjectDisabledStatus("cmd_cut", ietab.canCut);
  291.       gIeTab.updateObjectDisabledStatus("cmd_copy", ietab.canCopy);
  292.       gIeTab.updateObjectDisabledStatus("cmd_paste", ietab.canPaste);
  293.    }
  294. }
  295.  
  296. IeTab.prototype.updateToolsMenuItem = function(e) {
  297.    if (e.originalTarget != document.getElementById("menu_ToolsPopup")) return;
  298.    var menuitem = document.getElementById("ietab-toolsmenu");
  299.    if (menuitem) {
  300.       var showitem = gIeTab.getBoolPref("ietab.toolsmenu", true);
  301.       var showicon = gIeTab.getBoolPref("ietab.toolsmenu.icon", false);
  302.       menuitem.hidden = !showitem;
  303.       menuitem.setAttribute("class", (showicon?menuitem.getAttribute("iconic"):""));
  304.    }
  305. }
  306.  
  307. IeTab.prototype.updateSecureLockIcon = function() {
  308.    var ietab = gIeTab.getIeTabElmt();
  309.    if (ietab) {
  310.       var url = ietab.url;
  311.       const wpl = Components.interfaces.nsIWebProgressListener;
  312.       var state = (gIeTab.startsWith(url, "https://") ? wpl.STATE_IS_SECURE | wpl.STATE_SECURE_HIGH : wpl.STATE_IS_INSECURE);
  313.       window.XULBrowserWindow.onSecurityChange(null, null, state);
  314.       var securityButton = document.getElementById("security-button");
  315.       securityButton.setAttribute("label", gIeTab.getUrlHost(ietab.url));
  316.    }
  317. }
  318.  
  319. IeTab.prototype.updateInterface = function() {
  320.    gIeTab.updateStatusIcon();
  321.    gIeTab.updateToolButton();
  322.    gIeTab.updateBackForwardButtons();
  323.    gIeTab.updateStopReloadButtons();
  324.    gIeTab.updateSecureLockIcon();
  325.    gIeTab.updateUrlBar();
  326. }
  327.  
  328. IeTab.prototype.updateAll = function() {
  329.    if (gIeTab.updating) return;
  330.    try {
  331.       gIeTab.updating = true;
  332.       gIeTab.updateInterface();
  333.    } finally {
  334.       delete gIeTab.updating;
  335.    }
  336. }
  337.  
  338. IeTab.prototype.updateProgressStatus = function() {
  339.    var mTabs = gBrowser.mTabContainer.childNodes;
  340.    for(var i = 0 ; i < mTabs.length ; i++) {
  341.       if (mTabs[i].localName == "tab") {
  342.          var ietab = gIeTab.getIeTabElmt(mTabs[i]);
  343.          if (ietab) {
  344.             var aCurTotalProgress = ietab.progress;
  345.             if (aCurTotalProgress != mTabs[i].mProgress) {
  346.                const ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  347.                const wpl = Components.interfaces.nsIWebProgressListener;
  348.                var aMaxTotalProgress = (aCurTotalProgress == -1 ? -1 : 100);
  349.                var aTabListener = gBrowser.mTabListeners[mTabs[i]._tPos];
  350.                var aWebProgress = mTabs[i].linkedBrowser.webProgress;
  351.                var aRequest = ios.newChannelFromURI(mTabs[i].linkedBrowser.currentURI);
  352.                var aStateFlags = (aCurTotalProgress == -1 ? wpl.STATE_STOP : wpl.STATE_START) | wpl.STATE_IS_NETWORK;
  353.                aTabListener.onStateChange(aWebProgress, aRequest, aStateFlags, 0);
  354.                aTabListener.onProgressChange(aWebProgress, aRequest, 0, 0, aCurTotalProgress, aMaxTotalProgress);
  355.                mTabs[i].mProgress = aCurTotalProgress;
  356.             }
  357.          }
  358.       }
  359.    }
  360. }
  361.  
  362. IeTab.prototype.onProgressChange = function(progress) {
  363.    if (progress==0) gBrowser.userTypedValue = null;
  364.    gIeTab.updateProgressStatus();
  365.    gIeTab.updateAll();
  366. }
  367.  
  368. IeTab.prototype.onSecurityChange = function(security) {
  369.    gIeTab.updateSecureLockIcon();
  370. }
  371.  
  372. IeTab.prototype.goDoCommand = function(cmd) {
  373.    try {
  374.       var ietab = gIeTab.getIeTabElmt();
  375.       if (!ietab) return false;
  376.       switch (cmd) {
  377.       case "goBack":
  378.          if (!ietab.canBack) return false;
  379.          ietab.goBack();
  380.          break;
  381.       case "goForward":
  382.          if (!ietab.canForward) return false;
  383.          ietab.goForward();
  384.          break;
  385.       case "stop":
  386.          ietab.stop();
  387.          break;
  388.       case "refresh":
  389.          ietab.refresh();
  390.          break;
  391.       case "saveAs":
  392.          ietab.saveAs();
  393.          break;
  394.       case "print":
  395.          ietab.print();
  396.          break;
  397.       case "printSetup":
  398.          ietab.printSetup();
  399.          break;
  400.       case "printPreview":
  401.          ietab.printPreview();
  402.          break;
  403.       case "viewSource":
  404.          ietab.viewSource();
  405.          break;
  406.       case "find":
  407.          ietab.find();
  408.          break;
  409.       case "cmd_cut":
  410.          ietab.cut();
  411.          break;
  412.       case "cmd_copy":
  413.          ietab.copy();
  414.          break;
  415.       case "cmd_paste":
  416.          ietab.paste();
  417.          break;
  418.       case "cmd_selectAll":
  419.          ietab.selectAll();
  420.          break;
  421.       case "displaySecurityInfo":
  422.          break;
  423.       default:
  424.          return false;
  425.       }
  426.       return true;
  427.    } finally {
  428.       gIeTab.updateAll();
  429.    }
  430. }
  431.  
  432. IeTab.prototype.addBookmarkMenuitem = function(e) {
  433.    var popupMenu = e.originalTarget;
  434.    if (popupMenu.id != "placesContext") return;
  435.  
  436.    var miInt = document.getElementById("ietab-bookmark");
  437.    var miExt = document.getElementById("ietab-bookmark-extapp");
  438.  
  439.    var bmNode = document.popupNode.node;
  440.    var isBookmark = bmNode && PlacesUtils.nodeIsBookmark(bmNode);
  441.    var isShowIcon = gIeTab.getBoolPref("ietab.icon.bookmark", false);
  442.  
  443.    miInt.hidden = !isBookmark || !gIeTab.getBoolPref("ietab.bookmark", true);
  444.    miExt.hidden = !isBookmark || !gIeTab.getBoolPref("ietab.bookmark.extapp", true);
  445.    if (!miInt.hidden) {
  446.       miInt.setAttribute("oncommand", "gIeTab.addIeTab(\'"+bmNode.uri+"\');");
  447.       miInt.setAttribute("class", (isShowIcon?miInt.getAttribute("iconic"):""));
  448.    }
  449.    if (!miExt.hidden) {
  450.       miExt.setAttribute("oncommand", "gIeTab.loadInExtApp(\'"+bmNode.uri+"\');");
  451.       miExt.setAttribute("class", (isShowIcon?miExt.getAttribute("iconic"):""));
  452.    }
  453. }
  454.  
  455. IeTab.prototype.closeIeTab = function() {
  456.    var mTabs = gBrowser.mTabContainer.childNodes;
  457.    for(var i = mTabs.length-1 ; i>=0 ; i--) {
  458.       if (mTabs[i].localName == "tab") {
  459.          var ietab = gIeTab.getIeTabElmt(mTabs[i]);
  460.          if (ietab && (ietab.canClose)) gBrowser.removeTab(mTabs[i]);
  461.       }
  462.    }
  463. }
  464.  
  465. IeTab.prototype.getContextTab = function() {
  466.    return  (gBrowser && gBrowser.mContextTab && (gBrowser.mContextTab.localName == "tab") ? gBrowser.mContextTab : null);
  467. }
  468.  
  469. IeTab.prototype.viewLink = function(e) {
  470.    if (!gContextMenu) return;
  471.    var url = gIeTab.getContextLinkURL();
  472.  
  473.    switch (e.button) {
  474.    case 1:
  475.       var menu = e.originalTarget;
  476.       while (menu) {
  477.          if (menu.localName == "menupopup") break;
  478.          if (menu.localName == "popup") break;
  479.          menu = menu.parentNode;
  480.       }
  481.       if (menu) menu.hidePopup();
  482.    case 0:
  483.       if (e.ctrlKey) {
  484.          var ctrlExtApp = gIeTab.getBoolPref("ietab.ctrlclick", true);
  485.          if (ctrlExtApp ? gIeTab.loadInExtApp(url) : false) return;
  486.       }
  487.       gIeTab.addIeTab(url);
  488.       break;
  489.    case 2:
  490.       gIeTab.openPrefDialog(url);
  491.       break;
  492.    }
  493. }
  494.  
  495. IeTab.prototype.viewPage = function(e) {
  496.    var aTab = null;
  497.    switch (e.originalTarget.id) {
  498.    case "ietab-viewpage":
  499.       aTab = gBrowser.mCurrentTab;
  500.       break;
  501.    case "ietab-tabbar-switch":
  502.       aTab = gIeTab.getContextTab();
  503.       break;
  504.    }
  505.    if (!aTab) return;
  506.  
  507.    switch (e.button) {
  508.    case 0:
  509.       if (e.ctrlKey) {
  510.          var ctrlExtApp = gIeTab.getBoolPref("ietab.ctrlclick", true);
  511.          if (ctrlExtApp ? gIeTab.viewPageInExtApp(aTab) : false) return;
  512.       }
  513.       gIeTab.switchTabEngine(aTab, e.ctrlKey || gIeTab.getBoolPref("ietab.alwaysNewTab", false));
  514.       break;
  515.    case 1:
  516.       var menu = e.originalTarget;
  517.       while (menu) {
  518.          if (menu.localName == "menupopup") break;
  519.          if (menu.localName == "popup") break;
  520.          menu = menu.parentNode;
  521.       }
  522.       if (menu) menu.hidePopup();
  523.       gIeTab.switchTabEngine(aTab, true);
  524.       break;
  525.    case 2:
  526.       gIeTab.openPrefDialog(gIeTab.getIeTabElmtURL(aTab));
  527.       break;
  528.    }
  529. }
  530.  
  531. IeTab.prototype.updateTabbarMenu = function(e) {
  532.    if (e.originalTarget != gBrowser.mStrip.firstChild.nextSibling) return;
  533.  
  534.    var aTab = gIeTab.getContextTab();
  535.    var hide = (aTab == null);
  536.  
  537.    var internal = gIeTab.getBoolPref("ietab.tabsmenu", true);
  538.    var external = gIeTab.getBoolPref("ietab.tabsmenu.extapp", true);
  539.    var showicon = gIeTab.getBoolPref("ietab.icon.tabsmenu", false);
  540.  
  541.    var menuitem = null;
  542.  
  543.    //switch
  544.    menuitem = document.getElementById("ietab-tabbar-switch");
  545.    menuitem.hidden = hide || !internal;
  546.    menuitem.setAttribute("class", (showicon?menuitem.getAttribute("iconic"):""));
  547.  
  548.    //extapp
  549.    menuitem = document.getElementById("ietab-tabbar-extapp");
  550.    menuitem.hidden = hide || !external;
  551.    menuitem.setAttribute("class", (showicon?menuitem.getAttribute("iconic"):""));
  552.  
  553.    //sep
  554.    menuitem = document.getElementById("ietab-tabbar-sep");
  555.    menuitem.hidden = hide || (!internal && !external);
  556.  
  557.    if (aTab) {
  558.       var ietab = gIeTab.getIeTabElmt(aTab);
  559.       document.getElementById("ietab-tabbar-switch").setAttribute("engine", (ietab ? "ie" : "fx"));
  560.    }
  561. }
  562.  
  563. IeTab.prototype.createTabbarMenu = function() {
  564.    var tabbarMenu = gBrowser.mStrip.firstChild.nextSibling;
  565.    var menuitems = tabbarMenu.childNodes;
  566.    var separator = null;
  567.    for(var i=0, c=0 ; i < menuitems.length-1 ; i++) {
  568.       if (menuitems[i].localName=="menuseparator")
  569.          if (++c==2) { separator=menuitems[i]; break; }
  570.    }
  571.    tabbarMenu.insertBefore(document.getElementById("ietab-tabbar-sep"), separator);
  572.    tabbarMenu.insertBefore(document.getElementById("ietab-tabbar-switch"), separator);
  573.    tabbarMenu.insertBefore(document.getElementById("ietab-tabbar-extapp"), separator);
  574.    //disable toolbar menuitem tooltip
  575.    gIeTab.hookAttr(gBrowser.mStrip.firstChild, "onpopupshowing", "if (document.tooltipNode.localName != 'tab') return false;");
  576. }
  577.  
  578. IeTab.prototype.getTitleEnding = function(oldModifier) {
  579.    var ietab = gIeTab.getIeTabElmt();
  580.    if (ietab) {
  581.       var titleEnding = gIeTab.getStrPref("ietab.titleEnding", "");
  582.       if (titleEnding != "") return titleEnding;
  583.    }
  584.    return oldModifier;
  585. }
  586.  
  587. IeTab.prototype.focusIeTab = function() {
  588.    var ietab = gIeTab.getIeTabElmt();
  589.    if (ietab) ietab.focus();
  590. }
  591.  
  592. IeTab.prototype.onTabSelected = function(e) {
  593.    if (e.originalTarget.localName == "tabs") {
  594.       gIeTab.updateAll();
  595.       window.setTimeout(gIeTab.focusIeTab, 0);
  596.    }
  597. }
  598.  
  599. IeTab.prototype.assignJSObject = function(aDoc) {
  600.    if (aDoc instanceof HTMLDocument) {
  601.       var aBrowser = getBrowser().getBrowserForDocument(aDoc);
  602.       if (aBrowser && aBrowser.currentURI && aBrowser.currentURI.spec.indexOf(gIeTabChromeStr) == 0) {
  603.          if (aDoc && aDoc.getElementById('IETab')) {
  604.             var ietab = aDoc.getElementById('IETab');
  605.             if (ietab.wrappedJSObject) ietab = ietab.wrappedJSObject;
  606.             ietab.requestTarget = gIeTab;
  607.          }
  608.       }
  609.    }
  610. }
  611.  
  612. IeTab.prototype.onPageShowOrLoad = function(e) {
  613.    window.setTimeout(gIeTab.assignJSObject, 0, e.target);
  614.    gIeTab.updateAll();
  615. }
  616.  
  617. IeTab.prototype.getCurrentIeTabURI = function(aBrowser) {
  618.    try {
  619.       var docShell = aBrowser.boxObject.QueryInterface(Components.interfaces.nsIBrowserBoxObject).docShell;
  620.       var wNav = docShell.QueryInterface(Components.interfaces.nsIWebNavigation);
  621.       if (wNav.currentURI && wNav.currentURI.spec.indexOf(gIeTabChromeStr) == 0) {
  622.          var ietab = wNav.document.getElementById("IETab");
  623.          if (ietab) {
  624.             if (ietab.wrappedJSObject) ietab = ietab.wrappedJSObject;
  625.             var url = ietab.url;
  626.             if (url) {
  627.                const ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
  628.                return ios.newURI(gIeTabChromeStr + encodeURI(url), null, null);
  629.             }
  630.          }
  631.       }
  632.    } catch(e) {}
  633.    return null;
  634. }
  635.  
  636. IeTab.prototype.hookBrowserGetter = function(aBrowser) {
  637.    if (aBrowser.localName != "browser") aBrowser = aBrowser.getElementsByTagNameNS(kXULNS, "browser")[0];
  638.    // hook aBrowser.currentURI
  639.    gIeTab.hookProp(aBrowser, "currentURI", function() {
  640.       var uri = gIeTab.getCurrentIeTabURI(this);
  641.       if (uri) return uri;
  642.    });
  643.    // hook aBrowser.sessionHistory
  644.    gIeTab.hookProp(aBrowser, "sessionHistory", function() {
  645.       var history = this.webNavigation.sessionHistory;
  646.       var uri = gIeTab.getCurrentIeTabURI(this);
  647.       if (uri) {
  648.          var entry = history.getEntryAtIndex(history.index, false);
  649.          if (entry.URI.spec != uri.spec) {
  650.             entry.QueryInterface(Components.interfaces.nsISHEntry).setURI(uri);
  651.             if (this.parentNode.__SS_data) delete this.parentNode.__SS_data;
  652.          }
  653.       }
  654.    });
  655. }
  656.  
  657. IeTab.prototype.hookURLBarSetter = function(aURLBar) {
  658.    if (!aURLBar) aURLBar = document.getElementById("urlbar");
  659.    if (!aURLBar) return;
  660.    gIeTab.hookProp(aURLBar, "value", null, function() {
  661.       this.isModeIE = arguments[0] && (arguments[0].indexOf(gIeTabChromeStr) == 0);
  662.       if (this.isModeIE) {
  663.          arguments[0] = decodeURI(arguments[0].substring(gIeTabChromeStr.length));
  664.          if (arguments[0] == "about:blank") arguments[0] = "";
  665.       }
  666.    });
  667. }
  668.  
  669. IeTab.prototype.checkFilter = function(aBrowser, aRequest, aLocation) {
  670.    var ietabwatch = Components.classes["@mozilla.org/ietabwatch;1"].getService().wrappedJSObject;
  671.    if (ietabwatch && ietabwatch.shouldFilter(aLocation.spec)) {
  672.       aRequest.cancel(0x804b0002); //NS_BINDING_ABORTED
  673.       aBrowser.loadURI(aLocation.spec);
  674.    }
  675. }
  676.  
  677. IeTab.prototype.hookCodeAll = function() {
  678.    //hook properties
  679.    gIeTab.hookBrowserGetter(gBrowser.mTabContainer.firstChild.linkedBrowser);
  680.    gIeTab.hookURLBarSetter(gURLBar);
  681.  
  682.    //hook functions
  683.    gIeTab.hookCode("gFindBar._onBrowserKeypress", "this._useTypeAheadFind &&", "$& !gIeTab.isIeEngine() &&");
  684.    gIeTab.hookCode("PlacesCommandHook.bookmarkPage", "aBrowser.currentURI", "makeURI(gIeTab.getIeTabTrimURL($&.spec))");
  685.    gIeTab.hookCode("PlacesStarButton.updateState", "getBrowser().currentURI", "makeURI(gIeTab.getIeTabTrimURL($&.spec))");
  686.    gIeTab.hookCode("gBrowser.addTab", "return t;", "gIeTab.hookBrowserGetter(t.linkedBrowser); $&");
  687.    gIeTab.hookCode("nsBrowserAccess.prototype.openURI", "var loadflags = isExternal ?", "var loadflags = false ?");
  688.    gIeTab.hookCode("gBrowser.updateTitlebar", 'docElement.getAttribute("titlemodifier")', 'gIeTab.getTitleEnding($&)');
  689.    gIeTab.hookCode("gBrowser.setTabTitle", "if (browser.currentURI.spec) {", "$& if (browser.currentURI.spec.indexOf(gIeTabChromeStr) == 0) return;");
  690.    gIeTab.hookCode("URLBarSetURI", "getWebNavigation()", "getBrowser()");
  691.    gIeTab.hookCode("getShortcutOrURI", /return (\S+);/g, "return gIeTab.getHandledURL($1);");
  692.    if (gURLBar.handleCommand) gIeTab.hookCode("gURLBar.handleCommand", "this.value = url;", "url = gIeTab.getHandledURL(url); $&"); //fx3.1
  693.    else gIeTab.hookCode("BrowserLoadURL", "url = gURLBar.value;", "url = gIeTab.getHandledURL(gURLBar.value);"); //fx3.0
  694.    gIeTab.hookCode('gBrowser.mTabProgressListener', "function (aWebProgress, aRequest, aLocation) {", "$& gIeTab.checkFilter(this.mBrowser, aRequest, aLocation);");
  695.    for(var i=0 ; i<gBrowser.mTabListeners.length ; i++)
  696.       gIeTab.hookCode("gBrowser.mTabListeners["+i+"].onLocationChange", /{/, "$& gIeTab.checkFilter(this.mBrowser, aRequest, aLocation);");
  697.  
  698.    //hook Interface Commands
  699.    gIeTab.hookCode("BrowserBack", /{/, "$& if(gIeTab.goDoCommand('goBack')) return;");
  700.    gIeTab.hookCode("BrowserForward", /{/, "$& if(gIeTab.goDoCommand('goForward')) return;");
  701.    gIeTab.hookCode("BrowserStop", /{/, "$& if(gIeTab.goDoCommand('stop')) return;");
  702.    gIeTab.hookCode("BrowserReload", /{/, "$& if(gIeTab.goDoCommand('refresh')) return;");
  703.    gIeTab.hookCode("BrowserReloadSkipCache", /{/, "$& if(gIeTab.goDoCommand('refresh')) return;");
  704.  
  705.    gIeTab.hookCode("saveDocument", /{/, "$& if(gIeTab.goDoCommand('saveAs')) return;");
  706.    gIeTab.hookCode("BrowserViewSourceOfDocument", /{/, "$& if(gIeTab.goDoCommand('viewSource')) return;");
  707.    gIeTab.hookCode("MailIntegration.sendMessage", /{/, "$& var ietab = gIeTab.getIeTabElmt(); if(ietab){ arguments[0]=ietab.url; arguments[1]=ietab.title; }");
  708.  
  709.    gIeTab.hookCode("PrintUtils.print", /{/, "$& if(gIeTab.goDoCommand('print')) return;");
  710.    gIeTab.hookCode("PrintUtils.showPageSetup", /{/, "$& if(gIeTab.goDoCommand('printSetup')) return;");
  711.    gIeTab.hookCode("PrintUtils.printPreview", /{/, "$& if(gIeTab.goDoCommand('printPreview')) return;");
  712.  
  713.    gIeTab.hookCode("goDoCommand", /{/, "$& if(gIeTab.goDoCommand(arguments[0])) return;");
  714.  
  715.    gIeTab.hookAttr("cmd_find", "oncommand", "if(gIeTab.goDoCommand('find')) return;");
  716.    gIeTab.hookAttr("cmd_findAgain", "oncommand", "if(gIeTab.goDoCommand('find')) return;");
  717.    gIeTab.hookAttr("cmd_findPrevious", "oncommand", "if(gIeTab.goDoCommand('find')) return;");
  718.  
  719.    gIeTab.hookCode("displaySecurityInfo", /{/, "$& if(gIeTab.goDoCommand('displaySecurityInfo')) return;");
  720. }
  721.  
  722. IeTab.prototype.addEventAll = function() {
  723.    gIeTab.addEventListener(window, "DOMContentLoaded", gIeTab.onPageShowOrLoad);
  724.    gIeTab.addEventListener(window, "pageshow", gIeTab.onPageShowOrLoad);
  725.  
  726.    gIeTab.addEventListener(gBrowser.mStrip.firstChild.nextSibling, "popupshowing", gIeTab.updateTabbarMenu);
  727.    gIeTab.addEventListener("appcontent", "select", gIeTab.onTabSelected);
  728.  
  729.    gIeTab.addEventListener("goPopup", "popupshowing", gIeTab.updateGoMenuItems);
  730.    gIeTab.addEventListener("placesContext", "popupshowing", gIeTab.addBookmarkMenuitem);
  731.    gIeTab.addEventListener("menu_EditPopup", "popupshowing", gIeTab.updateEditMenuItems);
  732.    gIeTab.addEventListener("menu_ToolsPopup", "popupshowing", gIeTab.updateToolsMenuItem);
  733.    gIeTab.addEventListener("contentAreaContextMenu", "popupshowing", gIeTab.ietabContextMenuPopup);
  734. }
  735.  
  736. IeTab.prototype.removeEventAll = function() {
  737.    gIeTab.removeEventListener(window, "DOMContentLoaded", gIeTab.onPageShowOrLoad);
  738.    gIeTab.removeEventListener(window, "pageshow", gIeTab.onPageShowOrLoad);
  739.  
  740.    gIeTab.removeEventListener(gBrowser.mStrip.firstChild.nextSibling, "popupshowing", gIeTab.updateTabbarMenu);
  741.    gIeTab.removeEventListener("appcontent", "select", gIeTab.onTabSelected);
  742.  
  743.    gIeTab.removeEventListener("goPopup", "popupshowing", gIeTab.updateGoMenuItems);
  744.    gIeTab.removeEventListener("placesContext", "popupshowing", gIeTab.addBookmarkMenuitem);
  745.    gIeTab.removeEventListener("menu_EditPopup", "popupshowing", gIeTab.updateEditMenuItems);
  746.    gIeTab.removeEventListener("menu_ToolsPopup", "popupshowing", gIeTab.updateToolsMenuItem);
  747.    gIeTab.removeEventListener("contentAreaContextMenu", "popupshowing", gIeTab.ietabContextMenuPopup);
  748.  
  749.    gIeTab.removeEventListener(window, "load", gIeTab.init);
  750.    gIeTab.removeEventListener(window, "unload", gIeTab.destroy);
  751. }
  752.  
  753. IeTab.prototype.init = function() {
  754.    gIeTab.hookCodeAll();
  755.    gIeTab.addEventAll();
  756.    gIeTab.createTabbarMenu();
  757. }
  758.  
  759. IeTab.prototype.destroy = function() {
  760.    gIeTab.removeEventAll();
  761.    delete gIeTab;
  762. }
  763.  
  764. var gIeTab = new IeTab();
  765.  
  766. gIeTab.addEventListener(window, "load", gIeTab.init);
  767. gIeTab.addEventListener(window, "unload", gIeTab.destroy);
  768.